package com.shuiyun.jtt.utils;

import com.shuiyun.jtt.entity.vo.TachographResponse;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;

/**
 * @author shuiyun
 * @program device-simulator
 * @description 行驶记录仪命令字工具
 * @date 2022-05-12 22:32
 **/
public class TachographUtil {

    final static byte[] RESPONSE_HEADER = new byte[]{(byte) 0xAA,0x75};

    /**
     * 数据解码工具
     * @param content 待解码数据
     * @author shuiyun
     * @date 2022/5/12 22:54
     * @return 解码之后的命令帧数据
     */
    public static TachographResponse decode(byte[] content){
        ByteBuf buf = Unpooled.wrappedBuffer(content);
        buf = buf.slice(0, buf.readableBytes() - 1);
        byte bcc = ByteUtil.bcc(buf);
        if (bcc != content[content.length-1]){
            throw new RuntimeException("校验字不通过");
        }
        // 跳过头的读取 固定为 0xAA 0x75
        buf.skipBytes(2);
        // 命令字
        int key = buf.readUnsignedByte();
        // 数据长度
        int length = buf.readUnsignedShort();
        // 跳过备用字
        buf.skipBytes(1);
        byte[] bytes = new byte[length];
        buf.readBytes(bytes);
        return new TachographResponse(key,bytes);
    }

    /**
     * 数据编码
     * @param key 命令字
     * @param content 数据体
     * @author shuiyun
     * @date 2022/5/12 23:07
     * @return 编码好的数据
     */
    public static byte[] encode(byte key,byte[] content){
        ByteBuf buf = Unpooled.buffer();
        buf.writeBytes(RESPONSE_HEADER);
        // 命令字
        buf.writeByte(key);
        // 数据块长度
        buf.writeShort(content.length);
        // 备用字
        buf.writeByte(0x00);
        buf.writeBytes(content);
        byte bcc = ByteUtil.bcc(buf);
        buf.writeByte(bcc);
        return ByteUtil.readReadableBytes(buf);
    }
}
